import { mockCartList, mockDelay, mockApiResponse } from '@/api/goods/mock'
import http from '@/utils/http'
import { isLoggedIn } from '@/utils/auth'

// 是否使用模拟数据（开发时使用）
const USE_MOCK_DATA = false

/**
 * 获取购物车列表
 */
export async function getCartList() {
  // 检查用户是否已登录
  if (!isLoggedIn()) {
    uni.showToast({
      title: '请先登录',
      icon: 'none',
      duration: 2000
    })
    // 跳转到登录页
    setTimeout(() => {
      uni.navigateTo({
        url: '/pages/login/index'
      })
    }, 1500)
    throw new Error('用户未登录')
  }
  
  if(USE_MOCK_DATA){
    // 模拟获取购物车列表
    await mockDelay(500)
    return mockApiResponse(mockCartList)
  }
  
  try {
    const res = await http.get('/cart/list')  
    return mockApiResponse(res)
  } catch (error) {
    // 处理403权限错误
    if (error.message && error.message.includes('403')) {
      uni.showToast({
        title: '权限不足，请重新登录',
        icon: 'none',
        duration: 2000
      })
      // 清除登录信息并跳转到登录页
      uni.removeStorageSync('token')
      uni.removeStorageSync('userInfo')
      uni.removeStorageSync('isLogin')
      setTimeout(() => {
        uni.reLaunch({
          url: '/pages/login/index'
        })
      }, 1500)
    }
    throw error
  }
}

/**
 * 添加商品到购物车
 * @param {Object} cartData - 购物车数据
 */
export async function addToCart(cartData) {
  try {
    const result = await http.post('/cart/add', cartData)
    return result
  } catch (error) {
    console.error('添加购物车失败:', error)
    throw error
  }
}

/**
 * 更新购物车商品数量
 * @param {string|number} cartItemId - 购物车项ID
 * @param {number} quantity - 数量
 */
export async function updateCartQuantity(cartItemId, quantity) {
  try {
    const result = await http.put(`/cart/update/${cartItemId}`, { quantity })
    return result
  } catch (error) {
    console.error('更新购物车数量失败:', error)
    throw error
  }
}

/**
 * 删除购物车商品
 * @param {string|number} cartItemId - 购物车项ID
 */
export async function removeFromCart(cartItemId) {
  try {
    const result = await http.delete(`/cart/remove/${cartItemId}`)
    return result
  } catch (error) {
    console.error('删除购物车商品失败:', error)
    throw error
  }
}

/**
 * 清空购物车
 */
export async function clearCart() {
  try {
    const result = await http.delete('/cart/clear')
    return result
  } catch (error) {
    console.error('清空购物车失败:', error)
    throw error
  }
}

/**
 * 批量删除购物车商品
 * @param {Array} cartItemIds - 购物车项ID数组
 */
export async function batchRemoveFromCart(cartItemIds) {
  try {
    const result = await http.post('/cart/batch-remove', { cartItemIds })
    return result
  } catch (error) {
    console.error('批量删除购物车商品失败:', error)
    throw error
  }
}

/**
 * 选择/取消选择购物车商品
 * @param {string|number} cartItemId - 购物车项ID
 * @param {boolean} selected - 是否选中
 */
export async function selectCartItem(cartItemId, selected) {
  try {
    const result = await http.put(`/cart/select/${cartItemId}`, { selected })
    return result
  } catch (error) {
    console.error('选择购物车商品失败:', error)
    throw error
  }
}

/**
 * 全选/取消全选购物车商品
 * @param {boolean} selected - 是否全选
 */
export async function selectAllCartItems(selected) {
  try {
    const result = await http.put('/cart/select-all', { selected })
    return result
  } catch (error) {
    console.error('全选购物车商品失败:', error)
    throw error
  }
}

/**
 * 获取购物车统计信息
 */
export async function getCartStats() {
  try {
    const result = await http.get('/cart/stats')
    return result
  } catch (error) {
    console.error('获取购物车统计失败:', error)
    throw error
  }
}

/**
 * 检查商品是否在购物车中
 * @param {string|number} goodsId - 商品ID
 * @param {string|number} specId - 规格ID
 */
export async function checkInCart(goodsId, specId) {
  try {
    const result = await http.get('/cart/check', {
      goodsId,
      specId
    })
    return result
  } catch (error) {
    console.error('检查购物车状态失败:', error)
    throw error
  }
}

/**
 * 获取购物车推荐商品
 * @param {Object} params - 查询参数
 */
export async function getCartRecommendations(params = {}) {
  const { limit = 10 } = params
  
  try {
    const result = await http.get('/cart/recommendations', {
      limit
    })
    return result
  } catch (error) {
    console.error('获取购物车推荐失败:', error)
    throw error
  }
}    